package everyday;

import org.junit.jupiter.api.Test;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;

/**
 * 金额相关的操作
 *
 * @author gaojie
 * @date 2022-02-22
 */
public class BigDecimalOperation {

    /**
     * 测试金额相加：得出结论 - 新对象才有用，旧对象不会变
     */
    @Test
    void testAmountAdd() {
        BigDecimal a = new BigDecimal("5.55");
        BigDecimal add = a.add(new BigDecimal("2.22"));
        System.out.printf("加金额之后的原对象：%s%n", a);
        System.out.printf("加金额之后的新对象：%s%n", add);
    }

    /**
     * 测试 BigDecimal 转成 int 的时候，有小数的场景如何处理
     * 测试结果：向下取整
     */
    @Test
    void test02() {
        final BigDecimal b1 = new BigDecimal("0.1");
        final BigDecimal b4 = new BigDecimal("0.4");
        final BigDecimal b5 = new BigDecimal("0.5");
        final BigDecimal b6 = new BigDecimal("0.6");
        final BigDecimal b9 = new BigDecimal("0.9");
        final BigDecimal b11 = new BigDecimal("1.1");
        System.out.println(b1.intValue());
        System.out.println(b4.intValue());
        System.out.println(b5.intValue());
        System.out.println(b6.intValue());
        System.out.println(b9.intValue());
        System.out.println(b11.intValue());
    }

    /**
     * 测试 BigDecimal 转换成百分号格式的字符串
     */
    @Test
    void test03() {
        BigDecimal a = new BigDecimal("-0.12345");
        BigDecimal b = new BigDecimal("0.123");
        BigDecimal c = new BigDecimal("0.5");
        BigDecimal d = new BigDecimal("1");
        DecimalFormat decimalFormat = new DecimalFormat("#0.00");
        System.out.println(decimalFormat.format(0));
        System.out.println(decimalFormat.format(a.movePointRight(2).setScale(2, RoundingMode.HALF_UP)) + "%");
        System.out.println(decimalFormat.format(b.movePointRight(2).setScale(2, RoundingMode.HALF_UP)) + "%");
        System.out.println(decimalFormat.format(c.movePointRight(2).setScale(2, RoundingMode.HALF_UP)) + "%");
        System.out.println(decimalFormat.format(d.movePointRight(2).setScale(2, RoundingMode.HALF_UP)) + "%");
    }

    /**
     * 测试 BigDecimal 比较
     * 测试结果：equals方法，必须数值和位数都相等才算相等；compareTo只要数值相等就会返回0，所以比较的时候用compareTo更合适
     */
    @Test
    void test04() {
        final BigDecimal zero = BigDecimal.ZERO;
        final BigDecimal bigDecimal = BigDecimal.ZERO.setScale(6, RoundingMode.HALF_UP);
        System.out.println(zero.equals(bigDecimal));
        System.out.println(zero.compareTo(bigDecimal));
    }

    /**
     * 将金额转换成指定格式
     * 测试结果：转换成千分位带小数点2为时，会自动四舍五入，金额为null会报错
     */
    @Test
    void test05() {
        DecimalFormat format = new DecimalFormat("#,##0.00");
        final BigDecimal amount1 = new BigDecimal("123456789.12345");
        final BigDecimal amount2 = new BigDecimal("123456789");
        final BigDecimal amount3 = new BigDecimal("123456789.2");
        final BigDecimal amount4 = new BigDecimal("123456789.12945");
        System.out.println(format.format(amount1));
        System.out.println(format.format(amount2));
        System.out.println(format.format(amount3));
        System.out.println(format.format(amount4));
    }

    /**
     * 测试 BigDecimal 转 String，设置保留小数点2位的格式，会不会自动四舍五入
     * 【测试结果：会自动四舍五入】
     */
    @Test
    void test06() {
        DecimalFormat format = new DecimalFormat("#.00");
        final BigDecimal amount1 = new BigDecimal("123456789.12345");
        final BigDecimal amount2 = new BigDecimal("123456789");
        final BigDecimal amount3 = new BigDecimal("123456789.2");
        final BigDecimal amount4 = new BigDecimal("123456789.12945");
        System.out.println(format.format(amount1));
        System.out.println(format.format(amount2));
        System.out.println(format.format(amount3));
        System.out.println(format.format(amount4));
    }

    /**
     * 测试toPlainString生成的字符串，是否会显示成科学计数法
     * 测试结果：不会；而且 new BigDecimal("") 构造器会自动将科学计数法识别
     */
    @Test
    void test07() {
        BigDecimal b1 = new BigDecimal("8.0009090999E8");
        System.out.println(b1);
        System.out.println(b1.toPlainString());
        BigDecimal b2 = new BigDecimal("12345678909876543.2109");
        System.out.println(b2);
        System.out.println(b2.toPlainString());
    }
}
